// utils/request.js - 基础请求封装

/**
 * 封装uni.request请求方法
 * @param {Object} options - 请求配置
 * @returns {Promise} - 返回Promise对象
 */
const request = (options) => {
	// 处理请求地址
	const baseURL = 'http://192.168.0.102:8081/pet';
	const url = options.url.startsWith('http') ? options.url : baseURL + options.url;

	// 处理请求头
	const header = {
		'Content-Type': 'application/x-www-form-urlencoded',
		...options.header
	};

	// 获取并添加token (如果存在)
	const token = uni.getStorageSync('token');
	if (token) {
		header['token'] = `${token}`;
	}

	// 返回Promise对象
	return new Promise((resolve, reject) => {
		uni.request({
			url,
			data: options.data || {},
			method: options.method || 'GET',
			header,
			timeout: options.timeout || 60000, // 默认60s超时

			// 请求成功回调
			success: (res) => {
				// 根据自己的业务逻辑判断请求是否成功
				// 这里假设服务器返回格式 {code: 0, data: {}, message: ''}
				if (res.statusCode === 200) {
					if (res.data.code === 200) {
						// 业务层面成功
						resolve(res.data.data);
					} else if (res.data.code === 401) {
						// token失效
						uni.removeStorageSync('token');
						uni.showToast({
							title: '登录状态已过期，请重新登录',
							icon: 'none'
						});

						// 1.5秒后跳转到登录页
						setTimeout(() => {
							uni.navigateTo({
								url: '/pages/login/login'
							});
						}, 1500);

						reject(res.data);
					} else {
						// 其他业务错误
						uni.showToast({
							title: res.data.message || '请求失败',
							icon: 'none'
						});
						reject(res.data);
					}
				} else {
					// HTTP状态码错误
					uni.showToast({
						title: `网络请求错误: ${res.statusCode}`,
						icon: 'none'
					});
					reject(res);
				}
			},

			// 请求失败回调
			fail: (err) => {
				uni.showToast({
					title: '网络异常，请检查网络连接',
					icon: 'none'
				});
				reject(err);
			},

			// 请求完成回调 (成功或失败都会执行)
			complete: () => {
				// 可以在这里关闭loading等
				uni.hideLoading();
			}
		});
	});
};

/**
 * GET请求封装
 * @param {String} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其它配置
 * @returns {Promise} - 返回Promise对象
 */
const get = (url, data = {}, options = {}) => {
	return request({
		url,
		method: 'GET',
		data,
		...options
	});
};

/**
 * POST请求封装
 * @param {String} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其它配置
 * @returns {Promise} - 返回Promise对象
 */
const post = (url, data = {}, options = {}) => {
	return request({
		url,
		method: 'POST',
		data,
		...options
	});
};

/**
 * PUT请求封装
 * @param {String} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其它配置
 * @returns {Promise} - 返回Promise对象
 */
const put = (url, data = {}, options = {}) => {
	return request({
		url,
		method: 'PUT',
		data,
		...options
	});
};

/**
 * DELETE请求封装
 * @param {String} url - 请求地址
 * @param {Object} data - 请求参数
 * @param {Object} options - 其它配置
 * @returns {Promise} - 返回Promise对象
 */
const del = (url, data = {}, options = {}) => {
	return request({
		url,
		method: 'DELETE',
		data,
		...options
	});
};

/**
 * 上传文件请求封装
 * @param {String} url - 上传地址
 * @param {Object} options - 上传配置
 * @returns {Promise} - 返回Promise对象
 */
const uploadFile = (url, options = {}) => {
	// 处理请求地址
	const baseURL = 'http://192.168.0.102:8081/pet';
	const fullUrl = url.startsWith('http') ? url : baseURL + url;

	// 处理请求头
	const header = {
		...options.header
	};

	// 获取并添加token
	const token = uni.getStorageSync('token');
	if (token) {
		header['token'] = `${token}`;
	}

	// 返回Promise对象
	return new Promise((resolve, reject) => {
		uni.uploadFile({
			url: fullUrl,
			filePath: options.filePath,
			name: options.name || 'file',
			formData: options.formData || {},
			header,

			success: (res) => {
				if (res.statusCode === 200) {
					// 由于uploadFile返回的是字符串，需要手动转成对象
					const data = JSON.parse(res.data);
					if (data.code === 200) {
						resolve(data.data);
					} else {
						uni.showToast({
							title: data.message || '上传失败',
							icon: 'none'
						});
						reject(data);
					}
				} else {
					uni.showToast({
						title: `上传失败: ${res.statusCode}`,
						icon: 'none'
					});
					reject(res);
				}
			},

			fail: (err) => {
				uni.showToast({
					title: '上传失败，请检查网络连接',
					icon: 'none'
				});
				reject(err);
			},

			complete: () => {
				uni.hideLoading();
			}
		});
	});
};

// 导出API请求方法
export default {
	request,
	get,
	post,
	put,
	del,
	uploadFile
};